import win32gui

class GameWindow:
    def __init__(self, window_title="星痕共鸣"):
        """
        初始化时自动查找指定标题的窗口，并获取客户区坐标和尺寸。
        :param window_title: 游戏窗口标题（默认为“星痕共鸣”）
        """
        self.window_title = window_title
        self._hwnd = None
        self.x = 0
        self.y = 0
        self.w = 0
        self.h = 0

        self._find_and_update_window()

    def _find_and_update_window(self):
        """查找窗口并更新坐标和尺寸属性"""
        # 查找窗口句柄
        self._hwnd = win32gui.FindWindow(None, self.window_title)
        if self._hwnd == 0:
            raise RuntimeError(f"未找到标题为 '{self.window_title}' 的窗口，请确保游戏已启动并显示窗口。")

        # 获取客户区在屏幕上的实际位置和大小
        client_rect = win32gui.GetClientRect(self._hwnd)
        client_left, client_top, client_right, client_bottom = client_rect

        # 将客户区左上角坐标转换为屏幕坐标
        screen_left, screen_top = win32gui.ClientToScreen(self._hwnd, (client_left, client_top))
        screen_right, screen_bottom = win32gui.ClientToScreen(self._hwnd, (client_right, client_bottom))

        # 保存为实例属性
        self.x = screen_left
        self.y = screen_top
        self.w = screen_right - screen_left
        self.h = screen_bottom - screen_top

    def refresh(self):
        """
        手动刷新窗口位置和大小（例如窗口被移动或缩放后）
        """
        self._find_and_update_window()

    def __str__(self):
        return f"GameWindow(title='{self.window_title}', x={self.left}, y={self.top}, w={self.width}, h={self.height})"

    def __repr__(self):
        return self.__str__()